package cn.dvptech.remotecontrol.screenmirror.virtualDisplay;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLES20;
import android.opengl.GLES30;
import android.opengl.GLUtils;

import timber.log.Timber;

public class TextureUtils {
    private static final String TAG = "TextureUtils";

    // 加载纹理
    public static int loadTexture(Context context, int resourceId) {
        int[] textureHandle = new int[1];
        GLES30.glGenTextures(1, textureHandle, 0);

        if (textureHandle[0] == 0) {
            Timber.d("无法生成新的OpenGL纹理对象。");
            return 0;
        }
        try {
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId);
            if (bitmap == null) {
                Timber.d("资源ID " + resourceId + " 无法解码。");
                GLES30.glDeleteTextures(1, textureHandle, 0);
                return 0;
            }

            GLES30.glBindTexture(GLES30.GL_RGB565, textureHandle[0]);
            setTextureParameters();
            GLUtils.texImage2D(GLES30.GL_RGB565, 0, bitmap, 0);
            GLES30.glGenerateMipmap(GLES30.GL_RGB565);
        } catch (Exception e) {
            Timber.e("加载纹理时出错：%s", e.getMessage());
            GLES30.glDeleteTextures(1, textureHandle, 0);
            return 0;
        }

        return textureHandle[0];
    }

    // 加载OpenGL ES 2.0纹理
    public static int loadTexture20() {
        int[] textureHandle = new int[1];
        GLES20.glGenTextures(1, textureHandle, 0);
        if (textureHandle[0] == 0) {
            Timber.d("无法生成新的OpenGL纹理对象。");
            return 0;
        }
        GLES20.glBindTexture(GLES20.GL_RGB565, textureHandle[0]);
        GLES20.glTexParameteri(GLES20.GL_RGB565, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_RGB565, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_RGB565, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_RGB565, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        // 这里可以使用GLUtils或其他方法加载纹理数据
        // 例如：
        // GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); // 从位图加载纹理
        GLES20.glBindTexture(GLES20.GL_RGB565, 0); // 解绑纹理
        return textureHandle[0];
    }

    // 加载OpenGL ES 3.0纹理
    public static int loadTexture30() {
        int[] textureHandle = new int[1];
        GLES30.glGenTextures(1, textureHandle, 0);
        if (textureHandle[0] == 0) {
            Timber.d("无法生成新的OpenGL纹理对象。");
            return 0;
        }
        GLES30.glBindTexture(GLES30.GL_RGB565, textureHandle[0]);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
        // 这里可以使用GLUtils或其他方法加载纹理数据
        // 例如：
        // GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); // 从位图加载纹理
        GLES30.glBindTexture(GLES30.GL_RGB565, 0); // 解绑纹理
        return textureHandle[0];
    }

    // 设置纹理参数
    private static void setTextureParameters() {
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
        GLES30.glTexParameteri(GLES30.GL_RGB565, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
    }
}
